package com.cskaoyan.javase.homework.day22;

/**
 * @description: 题目
 * @author: 景天
 * @date: 2022/3/9 11:28
 **/

/*
   练习题:
   要求2个线程交替打印1A2B3C4D...
   wait notify
   附加: 怎么保证某个线程先执行 比如先打印A 再打印1
   =====通过flag标记做判断
 */
public class Work3 {
    // 定义一把锁
    private final static Object obj = new Object();
    // 定义1个标记值
    private static boolean flag = true;

    public static void main(String[] args) {
        // 定义2个字符串数组
        String s1 = "1234567";
        String s2 = "ABCDEFG";
        // 转为字符数组
        char[] chars1 = s1.toCharArray();
        char[] chars2 = s2.toCharArray();

        // 启动2个线程
        // 打印数字
        new Thread(() -> {
            synchronized (obj) {
                // 通过这个flag去判断
                // 如果是false 阻塞当前线程 先执行另一个线程
                while (!flag) {
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                // 遍历chars1
                for (char c : chars1) {
                    // 输出
                    System.out.print(c);
                    // notify
                    obj.notify();
                    // wait
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // 目的是叫醒另一个线程 避免另一个一直在wait
                obj.notify();
            }

        }).start();

        // 打印字母的
        new Thread(() -> {

            synchronized (obj) {
                // 修改flag的值
                flag = true;
                // 遍历chars1
                for (char c : chars2) {
                    // 输出
                    System.out.print(c);
                    // notify
                    obj.notify();
                    // wait
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                obj.notify();
            }
        }).start();
    }

}
